/**
 * 实现将一个中文文本拆分为多行
 * - 如果少于指定字符个数（默认20个），则直接返回原文本
 * - 如果超过指定字符个数（默认20个），则将文本拆分为多行
 * - 拆分规则：
 * > - 1. 寻找中文符号（逗号，句号，问号，感叹号，分号），从最中间的一个符号开始拆分为两行
 * > - 2. 如果没有找到中文符号，则将文本从中间拆分为两行
 * > - 3. 如果拆分后的行长度超过指定字符个数，则将拆分后的行再次拆分
 * > - 4. 重复上述步骤，直到所有行长度小于指定字符个数 
 * - 将全部行用“\N”连接起来，并返回
 * @param {string} text 中文文本
 * @param {number} maxChars 每行最大字符数，默认20
 * @returns {string} 拆分后的文本
 */
function cnText2MultiLines(text, maxChars = 20) {
  // 如果文本为空或长度小于等于最大字符数，直接返回
  if (!text || text.length <= maxChars) {
    return text;
  }

  // 递归拆分函数
  function splitLines(str) {
    // 如果字符串长度小于等于最大字符数，直接返回
    if (str.length <= maxChars) {
      return [str];
    }

    // 寻找中文标点符号位置
    const punctuationMarks = ['，', '。', '？', '！', '；'];
    let splitIndex = -1;
    let minDistance = Infinity;

    // 寻找最靠近中间的中文标点符号
    for (const mark of punctuationMarks) {
      let index = str.indexOf(mark);
      while (index !== -1) {
        const distanceToCenter = Math.abs(index - Math.floor(str.length / 2));
        if (distanceToCenter < minDistance) {
          minDistance = distanceToCenter;
          splitIndex = index + 1; // 分割点在标点符号之后
        }
        index = str.indexOf(mark, index + 1);
      }
    }

    // 如果没找到中文标点符号，则从中间拆分
    if (splitIndex === -1) {
      splitIndex = Math.floor(str.length / 2);
    }

    // 特殊情况处理：防止无限递归
    // 如果拆分点在字符串开头或结尾，强制从中间拆分
    if (splitIndex === 0 || splitIndex === str.length) {
      splitIndex = Math.floor(str.length / 2);
    }

    // 拆分为两部分
    const firstPart = str.substring(0, splitIndex);
    const secondPart = str.substring(splitIndex);

    // 如果拆分后的部分仍然太长且无法再按标点符号拆分，强制拆分
    if (firstPart.length > maxChars && secondPart.length > maxChars) {
      // 如果第一部分太长，从中拆分
      const firstPartSplit = firstPart.length <= maxChars ? [firstPart] : 
        [firstPart.substring(0, maxChars), firstPart.substring(maxChars)];
      
      // 如果第二部分太长，从中拆分
      const secondPartSplit = secondPart.length <= maxChars ? [secondPart] :
        [secondPart.substring(0, maxChars), secondPart.substring(maxChars)];
      
      return [...firstPartSplit, ...secondPartSplit];
    }

    // 正常递归处理
    const firstPartLines = splitLines(firstPart);
    const secondPartLines = splitLines(secondPart);

    // 合并结果
    return [...firstPartLines, ...secondPartLines];
  }

  // 执行拆分并用\N连接
  const lines = splitLines(text);
  return lines.join('\\N');
}

module.exports = { cnText2MultiLines };